class Obsercer {
    constructor (data) {
        this.$data = data
        this._walk(this.$data)
    }

    // 遍历data中的属性 并把data中的属性设置为响应式的     
    _walk (data) {
        if (!data || typeof data !== "object") {
            return
        }

        Object.keys(data).forEach(key => {
            this._defineReactive(data, key, data[key])
        })
    }

    // 设置为响应式数据
    _defineReactive (obj, key, value) {

        const that = this
        const dep = new Dep()
        Object.defineProperty(obj, key, {
            enumerable:true,
            configurable:true,
            get () {
                Dep.target && dep.addSub(Dep.target)
                return value
            },
            set (newValue) {
                if (newValue === value) return
                value = newValue
                // 设置newValue中的其他属性为响应式数据
                that._walk(newValue)
                dep.notify()
            }
        })
    }
}